package com.unsky.utils.jpasql;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import org.springframework.util.StringUtils;

/**
 * 条件处理
 * 1.1 支持多条件查询 但不支持括号操作
 * @project   xmlsql
 * @author    unsky
 * @date      2016年12月8日 下午8:18:01
 * @copyRight 山东阿帕网络技术有限公司
 * @webSite   http://www.kt56.com
 */
public class ConditionDeal {
	private String condition;
	List<String> conditions=new ArrayList<String>();
	private Map<String, Object> data;//操作数据
	private int operator=0;//操作,默认是&&操作
	public  String REG_NUM = "[-]{0,1}\\d+|[-]{0,1}\\d+\\.\\d+";
	public ConditionDeal(String condition, Map<String, Object> data) {
		super();
		this.condition = condition;
		this.data=data;
	}
	/**
	 * 分割条件 
	 * @Date unsky 2016年12月8日 下午8:21:44
	 */
	private void splitCondition(){
		if(condition.contains("||")){
			operator=1;//与操作
		}
		String[] conditionArr = condition.split("\\|\\|");
		for (String conditionStr : conditionArr) {
			String[] conditionStrArr = conditionStr.split("&&");
			for (String string : conditionStrArr) {
				conditions.add(string.trim());
			}
		}
		
		
	}
	
	public boolean getResult() throws Exception{
		splitCondition();
		boolean flag=false;
		for (String expression : conditions) {
			flag=doJudge(expression);
			if(flag&&operator==1){//与操作直接返回true
				return flag;
			}
			if(operator==0&&!flag){
				return false;
			}
		}
		return flag;
	}
	private boolean doJudge(String expression) throws Exception{
		//判断是否为空
		if(expression.contains("empty")){
			String key = expression.split("[ ]+")[0].trim();
			if(expression.contains("not")){
					return !StringUtils.isEmpty(data.get(key));
			}else{
				return StringUtils.isEmpty(data.get(key));
			}
		}
		String[] opes;
		String[] values = new String[2];
		if (expression.contains("!=")) {// 目前只支持=和!=操作
			opes = expression.split("!=");
		} else if (expression.contains("=")) {
			opes = expression.split("=");
		} else {
			throw new Exception("操作符异常!");
		}
		for (int i = 0; i < opes.length; i++) {
			
			if (opes[i].trim().equals("null")) {
				values[i] = null;
				continue;
			} else if (opes[i].trim().equals("''")) {
				values[i] = "";
				continue;
			}else if (data.get(opes[i].trim()) == null) {// 如果map无此元素  则判断是不是数字或者字符串 ;如果是则取字符串的或数字的值;无则置为null
				if(opes[i].trim().startsWith("'")){//判断是否是字符串
					values[i] =opes[i].trim().substring(1, opes[i].trim().length()-1);
				}else if( Pattern.matches(REG_NUM,opes[i].trim() )){//判断是否是数字
					values[i]=opes[i].trim();
				}else{
					values[i]=null;
					continue;
				}
			} 
			
			values[i] = opes[i].contains("#") ? data.get(opes[i].trim()).toString() : opes[i].trim();
		}
		if (expression.contains("!=")) {
			if(values[0]==null){
				return false;
			}
			if (!values[0].equals(values[1])) {
				return true;
			}
		} else {
			if(values[0]==null){
				if(values[1]==null){
					return true;
				} else{
					return false;
				}
			}
			if (values[0].equals(values[1])) {
				return true;
			}
		}
		return false;
	}
	
	public static void main(String[] args) {
		 
	}
	
}
